package com.team.ai.controller;


import com.team.ai.service.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;



import com.team.ai.entity.ResultEntity;


import com.team.ai.tool.AiTool;

import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import org.springframework.web.bind.annotation.RequestParam;


import java.io.*;
import java.util.UUID;

@CrossOrigin//跨域
@RestController//遵循RestFul
@RequestMapping("v2/ai/")
public class AiApiController {
    @Resource
    AiTool aiTool;
    @Resource
    GptService gptService;
    @Resource
    FaceMergeService faceMergeService;

    @Resource
    EditattrService editattrService;

    @Resource
    ChatGPTService chat;
    private static final Logger logger = LoggerFactory.getLogger(ToolController.class);//日志getLogger需要传入的类名
    @Value("${project.localfilepath}")
    private String localFilePath;//本地文件存储地址

    /**
     * Ai漫画脸 特效
     *
     * @param file 前端上传的文件
     * @return base64编码
     */
    @PostMapping("selfieAnime")
    private String selfieAnime(
            @RequestParam("file") MultipartFile file
    ) {
        String SuffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//获取文件后缀名
        String FileNewName = UUID.randomUUID() + SuffixName;//新的文件名
        File dest = new File(localFilePath + FileNewName);//生成新的文件
        if (!dest.getParentFile().exists()) {//判定文件夹是否存在
            dest.getParentFile().mkdir();//生成文件夹
        }
        try {
            file.transferTo(dest);//将临时文件转为正式文件
            String re = aiTool.SelfieAnime(dest.getPath());//上传文件路径
            dest.delete();
            return ResultEntity.success(re);//返回本地的文件路径字符串
        } catch (Exception e) {
            logger.error(e.getMessage());//输出日志
            return ResultEntity.fail(-10001);//返回错误代码
        }
    }
    /**
     * 图片 解析 缺少介绍
     * @param file 上传图片
     * @return base64
     */
    @PostMapping("advancedGeneral")
    private String advancedGeneral(
            @RequestParam("file") MultipartFile file
    ) {
        String SuffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//获取文件后缀名
        String FileNewName = UUID.randomUUID() + SuffixName;//新的文件名
        File dest = new File(localFilePath + FileNewName);//生成新的文件
        if (!dest.getParentFile().exists()) {//判定文件夹是否存在
            dest.getParentFile().mkdir();//生成文件夹
        }
        try {
            file.transferTo(dest);//将临时文件转为正式文件
            String re = aiTool.advancedGeneral(dest.getPath());//上传文件路径
            dest.delete();
            return ResultEntity.success(re);//返回本地的文件路径字符串
        } catch (Exception e) {
            logger.error(e.getMessage());//输出日志
            return ResultEntity.fail(-10001);//返回错误代码
        }
    }
    /**
     * 图像清晰技术
     * @param file 上传图片
     * @return json
     */
    @PostMapping("imagedefinitionenhance")
    private String imagedefinitionenhance(
            @RequestParam("file") MultipartFile file
    ) {
        String SuffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//获取文件后缀名
        String FileNewName = UUID.randomUUID() + SuffixName;//新的文件名
        File dest = new File(localFilePath + FileNewName);//生成新的文件
        if (!dest.getParentFile().exists()) {//判定文件夹是否存在
            dest.getParentFile().mkdir();//生成文件夹
        }
        try {
            file.transferTo(dest);//将临时文件转为正式文件
            String re = aiTool.imagedefinitionenhance(dest.getPath());//上传文件路径
            dest.delete();
            return ResultEntity.success(re);//返回本地的文件路径字符串
        } catch (Exception e) {
            logger.error(e.getMessage());//输出日志
            return ResultEntity.fail(-10001);//返回错误代码
        }
    }
    /**
     * 智能写诗
     * @param text 输入你的题目
     * @param index 序号 每次+1 初始值0
     * @return
     */
    @PostMapping("generatePoem")
    private String generatePoem(@RequestParam("text") String text,@RequestParam("index") int index) {
        return ResultEntity.success(aiTool.generatePoem(text,index));
    }

    /**
     * 春联
     * @param text 输入你的题目
     * @param index 序号 每次+1 初始值0
     * @return
     */
    @PostMapping("couplets")
    private String couplets(@RequestParam("text") String text,@RequestParam("index") int index) {
        return ResultEntity.success(aiTool.couplets(text,index));
    }

    /**
     * 祝福语
     * @param text
     * @return
     */
    @PostMapping("blesscreation")
    private String bless_creation(@RequestParam("text") String text) {
        return ResultEntity.success(aiTool.bless_creation(text));
    }


    /**
     * 情感倾向分析
     */
    @PostMapping("Affectivetendencyanalysis")
    private String Affectivetendencyanalysis(@RequestParam("text") String text) {
        return ResultEntity.success(aiTool.Affectivetendencyanalysis(text));
    }
    /**
     * 地址识别
     */
    @PostMapping("address")
    private String address(@RequestParam("text") String text) {
        return ResultEntity.success(aiTool.address(text));
    }

    /**
     * 文本纠错
     * @param text
     * @return
     */
    @PostMapping("ecnet")
    private String ecnet(@RequestParam("text") String text) {
        return ResultEntity.success(aiTool.ecnet(text));
    }

    /**
     * 黑白上色
     */

    @PostMapping("colourize")
    private String colourize(
            @RequestParam("file") MultipartFile file
    ) {
        String SuffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//获取文件后缀名
        String FileNewName = UUID.randomUUID() + SuffixName;//新的文件名
        File dest = new File(localFilePath + FileNewName);//生成新的文件
        if (!dest.getParentFile().exists()) {//判定文件夹是否存在
            dest.getParentFile().mkdir();//生成文件夹
        }
        try {
            file.transferTo(dest);//将临时文件转为正式文件
            String re = aiTool.colourize(dest.getPath());//上传文件路径
            dest.delete();
            return ResultEntity.success(re);//返回本地的文件路径字符串
        } catch (Exception e) {
            logger.error(e.getMessage());//输出日志
            return ResultEntity.fail(-10001);//返回错误代码
        }
    }

    /**
     * 通用文字识别
     * @param file
     * @return
     */

    @PostMapping("generalBasic")
    private String generalBasic(
            @RequestParam("file") MultipartFile file
    ) {
        String SuffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//获取文件后缀名
        String FileNewName = UUID.randomUUID() + SuffixName;//新的文件名
        File dest = new File(localFilePath + FileNewName);//生成新的文件
        if (!dest.getParentFile().exists()) {//判定文件夹是否存在
            dest.getParentFile().mkdir();//生成文件夹
        }
        try {
            file.transferTo(dest);//将临时文件转为正式文件
            String re = aiTool.generalBasic(dest.getPath());//上传文件路径
            dest.delete();
            return ResultEntity.success(re);//返回本地的文件路径字符串
        } catch (Exception e) {
            logger.error(e.getMessage());//输出日志
            return ResultEntity.fail(-10001);//返回错误代码
        }
    }

    /**
     * 人脸融合
     * @param file
     * @return
     */
    @PostMapping("faceMerge")
    private String faceMerge(
            @RequestParam("file") MultipartFile file,
            @RequestParam("file1") MultipartFile file1
    ) {
        String SuffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//获取文件后缀名
        String SuffixName1 = file1.getOriginalFilename().substring(file1.getOriginalFilename().lastIndexOf("."));//获取文件后缀名
        String FileNewName = UUID.randomUUID() + SuffixName;//新的文件名
        String FileNewName1 = UUID.randomUUID() + SuffixName1;//新的文件名
        File dest = new File(localFilePath + FileNewName);//生成新的文件
        File dest1 = new File(localFilePath + FileNewName1);//生成新的文件

        if (!dest.getParentFile().exists()) {//判定文件夹是否存在
            dest.getParentFile().mkdir();//生成文件夹
        }
        if (!dest1.getParentFile().exists()) {//判定文件夹是否存在
            dest1.getParentFile().mkdir();//生成文件夹
        }
        try {
            file.transferTo(dest);//将临时文件转为正式文件
            file1.transferTo(dest1);//将临时文件转为正式文件
            String re = faceMergeService.faceMerge(dest.getPath(),dest1.getPath());//上传文件路径
            dest.delete();
            dest1.delete();
            return ResultEntity.success(re);//返回本地的文件路径字符串
        } catch (Exception e) {
            logger.error(e.getMessage());//输出日志
            return ResultEntity.fail(-10001);//返回错误代码
        }
    }

    /**
     * 人脸属性编辑
     * @param file 图片路径
     * @param actionType 人脸编辑方式
     * @param target 该参数仅在action_type为V2_AGE或V2_GENDER时生效。
     * @return
     */

    @PostMapping("editattr")
    private String editattr(
            @RequestParam("file") MultipartFile file,
            @RequestParam("actionType") String actionType,
            @RequestParam("target") String target

            ) {
        String SuffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//获取文件后缀名
        String FileNewName = UUID.randomUUID() + SuffixName;//新的文件名
        File dest = new File(localFilePath + FileNewName);//生成新的文件
        if (!dest.getParentFile().exists()) {//判定文件夹是否存在
            dest.getParentFile().mkdir();//生成文件夹
        }
        try {
            file.transferTo(dest);//将临时文件转为正式文件
            String re = editattrService.faceMerge(dest.getPath(),actionType,target);//上传文件路径
            dest.delete();
            return ResultEntity.success(re);//返回本地的文件路径字符串
        } catch (Exception e) {
            logger.error(e.getMessage());//输出日志
            return ResultEntity.fail(-10001);//返回错误代码
        }
    }



    /**
     * 动物识别
     * @param file
     * @return
     */
    @PostMapping("animal")
    private String animal(
            @RequestParam("file") MultipartFile file
    ) {
        String SuffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//获取文件后缀名
        String FileNewName = UUID.randomUUID() + SuffixName;//新的文件名
        File dest = new File(localFilePath + FileNewName);//生成新的文件
        if (!dest.getParentFile().exists()) {//判定文件夹是否存在
            dest.getParentFile().mkdir();//生成文件夹
        }
        try {
            file.transferTo(dest);//将临时文件转为正式文件
            String re = aiTool.animal(dest.getPath());//上传文件路径
            dest.delete();
            return ResultEntity.success(re);//返回本地的文件路径字符串
        } catch (Exception e) {
            logger.error(e.getMessage());//输出日志
            return ResultEntity.fail(-10001);//返回错误代码
        }
    }

    /**
     * 植物识别
     * @param file
     * @return
     */
    @PostMapping("plant")
    private String plant(
            @RequestParam("file") MultipartFile file
    ) {
        String SuffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//获取文件后缀名
        String FileNewName = UUID.randomUUID() + SuffixName;//新的文件名
        File dest = new File(localFilePath + FileNewName);//生成新的文件
        if (!dest.getParentFile().exists()) {//判定文件夹是否存在
            dest.getParentFile().mkdir();//生成文件夹
        }
        try {
            file.transferTo(dest);//将临时文件转为正式文件
            String re = aiTool.plant(dest.getPath());//上传文件路径
            dest.delete();
            return ResultEntity.success(re);//返回本地的文件路径字符串
        } catch (Exception e) {
            logger.error(e.getMessage());//输出日志
            return ResultEntity.fail(-10001);//返回错误代码
        }
    }

    /**
     * 果蔬识别
     * @param file
     * @return
     */
    @PostMapping("ingredient")
    private String ingredient(
            @RequestParam("file") MultipartFile file
    ) {
        String SuffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));//获取文件后缀名
        String FileNewName = UUID.randomUUID() + SuffixName;//新的文件名
        File dest = new File(localFilePath + FileNewName);//生成新的文件
        if (!dest.getParentFile().exists()) {//判定文件夹是否存在
            dest.getParentFile().mkdir();//生成文件夹
        }
        try {
            file.transferTo(dest);//将临时文件转为正式文件
            String re = aiTool.ingredient(dest.getPath());//上传文件路径
            dest.delete();
            return ResultEntity.success(re);//返回本地的文件路径字符串
        } catch (Exception e) {
            logger.error(e.getMessage());//输出日志
            return ResultEntity.fail(-10001);//返回错误代码
        }
    }












    /**
     * 油画
     * @param text 输入内容
     * @param resolution 图片大小
     * @param style 风格
     * @param num 数量
     * @return
     */
    @PostMapping("txt2img")
    private String txt2img(@RequestParam("text") String text,
                           @RequestParam("resolution") String resolution,
                           @RequestParam("style") String style,
                           @RequestParam("num") int num) {
        try {
            return ResultEntity.success(aiTool.txt2img(text,resolution,style,num));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @PostMapping("getImg")
    private String getImg(@RequestParam("taskId") String taskId) {
        return ResultEntity.success(aiTool.getImg(taskId));
    }


    /**
     * 聊天机器人
     * @param q 输入问题
     * @return json
     */
    @GetMapping("qingyun")
    private String qingyun(
            @RequestParam("q") String q
    ){
        return ResultEntity.success(aiTool.aiReply(q));
    }

    /**
     * openai chatgpt
     * @param q 输入的问题
     * @return json
     */
    @GetMapping("OpenAi")
    public String OpenAi(
            @RequestParam("q") String q
    ){
        return chat.Chat(q);
    }
    /**
     * chatgpt 首选
     * @param q 问题
     * @return json
     */
    @PostMapping("test")
    private String test(
            @RequestParam String q
    ) throws IOException {
        return ResultEntity.success(gptService.sendPost(q));
    }

}
